package com.kingwood.algorithm.test;

/**
 * @Author 22025812
 * @Description: TODO
 * https://blog.csdn.net/qfc_128220/article/details/134387280
 * 虚拟理财游戏
 * 在一款虚拟游戏中生活，你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。
 * 现有一家Bank，它提供有若干理财产品 m 个，风险及投资回报不同，你有 N（元）进行投资，能接收的总风险值为X。
 * 你要在可接受范围内选择最优的投资方式获得最大回报。
 * 备注：
 * 在虚拟游戏中，每项投资风险值相加为总风险值；
 * 在虚拟游戏中，最多只能投资2个理财产品；
 * 在虚拟游戏中，最小单位为整数，不能拆分为小数；
 * 投资额*回报率=投资回报
 * @Date: 2024/3/25 14:50
 * @Modified By：
 * @Version 1.0
 */
import java.util.*;

public class LiCai {

    public static class Project {
          public int returnRate;
          public int riskVal;
          public int maxAmount;

          public Project(int returnRate, int riskVal, int maxAmount) {
              this.returnRate = returnRate;
              this.riskVal = riskVal;
              this.maxAmount = maxAmount;
          }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt(); // 策略数量
        int totalAmount = scanner.nextInt(); // 总投资额
        int X = scanner.nextInt(); // 可接受的风险数
        scanner.nextLine();

        int[] returnRateLst = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[] riskLst = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int[] maxAmountLst = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

        Project[] projects = new Project[n];

        for (int i = 0; i < n; i++) {
            projects[i] = new Project(returnRateLst[i], riskLst[i], maxAmountLst[i]);
        }

        int maxReturn = 0;
        int[][] pairs = new int[2][2];

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                // 可接受的总风险超过X
                if (projects[i].riskVal + projects[j].riskVal > X) {
                    continue;
                }

                int iAmount, jAmount;
                if (projects[i].maxAmount + projects[j].maxAmount <= totalAmount) {
                    // 如果当前的投资额 没有超出总投资额
                    iAmount = projects[i].maxAmount;
                    jAmount = projects[j].maxAmount;
                } else {
                    // 如果当前的投资额 超出了总投资额
                    if (projects[i].returnRate >= projects[j].returnRate) {
                        // 如果 i 的回报率 大于 j 的回报率
                        iAmount = Math.min(projects[i].maxAmount, totalAmount);
                        jAmount = totalAmount - iAmount;
                    } else {
                        jAmount = Math.min(projects[j].maxAmount, totalAmount);
                        iAmount = totalAmount - jAmount;
                    }
                }

                int curReturn = iAmount * projects[i].returnRate + jAmount * projects[j].returnRate;

                if (curReturn > maxReturn) {
                    maxReturn = curReturn;
                    pairs[0][0] = i;
                    pairs[0][1] = iAmount;
                    pairs[1][0] = j;
                    pairs[1][1] = jAmount;
                }
            }
        }

        int[] ans = new int[n];
        ans[pairs[0][0]] = pairs[0][1];
        ans[pairs[1][0]] = pairs[1][1];

        for (int i = 0; i < n; i++) {
            System.out.print(ans[i] + " ");
        }

    }
}

